#!/usr/bin/python
# -*-coding:UTF-8 -*-

# ========================
# @Time  : 2021/3/3
# @Author: Sunny
# ========================
"""
一、使用队列和进程完成下面要求（生产者消费者模式）

1、用一个队列来存储数据

2、创建一个专门生产数据的进程类，当队列中数据数量少于50时，开始生产数据，每次生产200个数据，添加到队列中，每生产完一轮 暂停1秒

3、创建一个专门获取数据的进程类，当 队列中数据数量  大于10时就开始获取，,循环获取，每次获取20个。当 队列中数据数量  少于10的时候，暂停2秒

4、启动程序 创建一个进程生产数据 ，5个进程获取数据
"""
import time
from multiprocessing import Process, Queue


class Product(Process):
    """生产数据的进程类"""

    def __init__(self, q):
        super().__init__()
        self.q = q

    def run(self):
        if self.q.qsize() < 50:
            for a in range(200):
                self.q.put(a)
                print(f'当前生成数据的进程是{self.pid},生产数据:{a}')
            time.sleep(1)


class GetData(Process):
    """获取数据的进程类"""

    def __init__(self, q):
        super().__init__()
        self.q = q

    def run(self):
        # if self.q.qsize() > 10:
        #     for b in range(20):
        #         if self.q.qsize() < 10:
        #             time.sleep(2)
        #         else:
        #             self.q.get()
        #         print(f'当前获取数据的进程是{self.pid},生产数据:{self.q.get()}')
        while True:
            if self.q.qsize() > 10:
                for b in range(20):
                    self.q.get()
                    print(f'当前获取数据的进程是{self.pid},生产数据:{self.q.get()}')
            else:
                time.sleep(2)


def main():
    q = Queue()
    p_list = []
    # 创建一个生产数据进程
    product_p = Product(q)
    p_list.append(product_p)
    product_p.start()

    # 创建获取数据的进程
    for i in range(5):
        p = GetData(q)
        p_list.append(p)
        p.start()

    for q in p_list:
        q.join()


if __name__ == '__main__':
    main()
